home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
051-060
/
amok52
/
abitur
/
txt
/
stundenplan.mod
< prev
next >
Wrap
Text File
|
1993-11-04
|
7KB
|
269 lines
IMPLEMENTATION MODULE StundenPlan;
FROM AbiturScreen IMPORT weisS, hgraU, blaU, dgraU, roT, BACKScreen;
IMPORT RandomNoten; (* Damit wird RND.Seed gesetzt *)
FROM FaecherNamen IMPORT FaecherTypen, FaecherNamen;
FROM SYSTEM IMPORT ADR;
FROM RandomNumber IMPORT RND;
FROM Arts IMPORT BreakPoint, Assert;
FROM Intuition IMPORT customScreen, NewWindow, WindowPtr,
IDCMPFlagSet, IDCMPFlags, WindowFlagSet,
WindowFlags, OpenWindow, CloseWindow,
RefreshWindowFrame, SetWindowTitles,
WindowToFront;
FROM Graphics IMPORT Text, Move, Draw, SetAPen, RastPortPtr;
FROM Str IMPORT Length;
CONST Jahr1Titel = "1. Schulbabys";
Jahr2Titel = "2. Schulstreß";
Jahr3Titel = "3. Langeweile";
Jahr4Titel = "4. Bald Ende";
PROCEDURE InitPlaene;
VAR J:INTEGER;
rnd: INTEGER;
T,S: INTEGER; (* T: Tag, S: Stunde *)
BEGIN
FOR J := 1 TO 4 DO
Plaene[J].W := NIL;
FOR T := 0 TO 5 DO
FOR S := 8 TO 15 DO
WITH Plaene[J].Bele[T,S] DO
Frei := (S = 12) OR ((T=2)AND(S > 11)) OR ((T=5)AND(S>11));
MaturFach := (J = 4) AND (RND(3) = 1);
rnd := RND(ORD(Informatik) + 1);
Typ := Turnen;
WHILE rnd > 0 DO
INC(Typ);
DEC(rnd)
END
END
END
END
END
END InitPlaene;
PROCEDURE IncTime;
VAR i : INTEGER;
BEGIN
WITH Zeit DO
IF (Tag = 5) AND (Stunde = 11) THEN
Tag := 0;
Stunde := 8
ELSIF (Tag = 2) AND (Stunde = 11) THEN
Tag := 3;
Stunde := 8
ELSIF Stunde = 11 THEN
Stunde := 13
ELSIF Stunde = 15 THEN
INC(Tag);
Stunde := 8
ELSE
INC(Stunde)
END
END;
FOR i := 1 TO 4 DO
IF Plaene[i].W # NIL THEN
ZeigePlan(i)
END
END
END IncTime;
PROCEDURE GetFach(Jahr: INTEGER): FaecherTypen;
(* Gibt vom aktuellen Jahr das aktuelle Fach zurück.
* Achtung: vor dem ersten IncTime kommt immer Turnen zurück.
*)
BEGIN
IF Zeit.Stunde = 7 THEN RETURN Turnen END;
RETURN Plaene[Jahr].Bele[Zeit.Tag,Zeit.Stunde].Typ
END GetFach;
PROCEDURE ZeichnePlan(Jahr: INTEGER);
VAR RP: RastPortPtr;
S, T, i, j: INTEGER;
BEGIN
(* Das Window wurde eben geöffnet, diese Procedur kann nur
* von ZeigePlan aufgerufen werden
*)
RP := Plaene[Jahr].W^.rPort;
SetAPen(RP, hgraU);
(* Zeichne Tage *)
Move(RP, 1, 18);
Text(RP, ADR(" \"), 2);
Move(RP, 24, 18);
Text(RP, ADR("MO"), 2);
Move(RP, 47, 18);
Text(RP, ADR("DI"), 2);
Move(RP, 70, 18);
Text(RP, ADR("MI"), 2);
Move(RP, 93, 18);
Text(RP, ADR("DO"), 2);
Move(RP, 116, 18);
Text(RP, ADR("FR"), 2);
Move(RP, 139, 18);
Text(RP, ADR("SA"), 2);
(* Zeiten *)
FOR S := 8 TO 18 DO
Move(RP, 3, 30 + (S-8) * 11);
CASE S OF
8: Text(RP, ADR(" 8"), 2);
| 9: Text(RP, ADR(" 9"), 2);
|10: Text(RP, ADR("10"), 2);
|11: Text(RP, ADR("11"), 2);
|12: Text(RP, ADR("12"), 2);
|13: Text(RP, ADR("13"), 2);
|14: Text(RP, ADR("14"), 2);
|15: Text(RP, ADR("15"), 2);
ELSE
END
END;
(* Faecher *)
FOR T := 0 TO 5 DO
FOR S := 8 TO 15 DO
WITH Plaene[Jahr].Bele[T,S] DO
IF NOT Frei THEN
Move(RP, 23 * T + 24,
11 * S - 57);
IF MaturFach THEN
SetAPen(RP, blaU)
ELSE
SetAPen(RP, weisS)
END;
Text(RP, ADR(FaecherNamen[Typ].ShortCut),
Length(FaecherNamen[Typ].ShortCut))
END
END
END
END;
(* Linien *)
SetAPen(RP, dgraU);
FOR i := 0 TO 7 DO
Move(RP, 0, 11 * i + 22);
Draw(RP,Plaene[Jahr].W^.width, 11 * i + 22)
END;
FOR j := 0 TO 5 DO
Move(RP, 23 * j + 20, 0);
Draw(RP, 23 * j + 20, Plaene[Jahr].W^.height)
END;
RefreshWindowFrame(Plaene[Jahr].W)
END ZeichnePlan;
PROCEDURE MarkKasten(Jahr, Tag, Stunde, Farbe: INTEGER);
VAR T, S: INTEGER;
VAR RP: RastPortPtr;
BEGIN
RP := Plaene[Jahr].W^.rPort;
T := 23 * Tag + 20;
S := 11 * (Stunde - 8) + 22 ;
SetAPen(RP, Farbe);
Move(RP, T , S);
Draw(RP, T + 23, S);
Draw(RP, T + 23, S + 11);
Draw(RP, T , S + 11);
Draw(RP, T , S);
END MarkKasten;
PROCEDURE MarkAktuelleStunde(J: INTEGER);
VAR T, S: INTEGER;
BEGIN
T := Zeit.Tag; (* 0 .. 5 *)
S := Zeit.Stunde; (* 8 .. 15 *)
IF (S = 8) AND (T > 0) AND (T # 3) THEN
MarkKasten(J, T - 1, 15,dgraU);
MarkKasten(J, T , 8, roT)
ELSIF (S = 8) AND (T = 3) THEN
MarkKasten(J, 2 , 11, dgraU);
MarkKasten(J, 3 , 8, roT)
ELSIF (S = 8) AND (T = 0) THEN
MarkKasten(J, 5 , 11, dgraU);
MarkKasten(J, 0 , 8, roT)
ELSIF S = 13 THEN
MarkKasten(J, T, 11, dgraU);
MarkKasten(J, T, 13, roT)
ELSIF S > 8 THEN
MarkKasten(J, T, S-1, dgraU);
MarkKasten(J, T, S , roT)
END;
RefreshWindowFrame(Plaene[J].W)
END MarkAktuelleStunde;
VAR NewPlanWindow: NewWindow;
PROCEDURE ZeigePlan(Jahr: INTEGER);
BEGIN
IF Plaene[Jahr].W = NIL THEN
Plaene[Jahr].W := OpenWindow(NewPlanWindow);
Assert(Plaene[Jahr].W # NIL, ADR("Fenster Problem"));
CASE Jahr OF
1: SetWindowTitles(Plaene[Jahr].W, ADR(Jahr1Titel), -1)
| 2: SetWindowTitles(Plaene[Jahr].W, ADR(Jahr2Titel), -1)
| 3: SetWindowTitles(Plaene[Jahr].W, ADR(Jahr3Titel), -1)
| 4: SetWindowTitles(Plaene[Jahr].W, ADR(Jahr4Titel), -1)
ELSE
END;
ZeichnePlan(Jahr)
END;
WindowToFront(Plaene[Jahr].W);
MarkAktuelleStunde(Jahr)
END ZeigePlan;
PROCEDURE ClosePlanFenster(Jahr: INTEGER);
BEGIN
IF Plaene[Jahr].W # NIL THEN
CloseWindow(Plaene[Jahr].W);
Plaene[Jahr].W := NIL
END
END ClosePlanFenster;
BEGIN (* Initialisierung *)
Zeit.Tag := 0;
Zeit.Stunde := 8;
WITH NewPlanWindow DO
leftEdge := 0;
topEdge := 100;
width := 160;
height := 111;
detailPen := 0;
blockPen := 1;
idcmpFlags := IDCMPFlagSet{closeWindow};
flags := WindowFlagSet{windowDrag, windowClose, windowDepth};
firstGadget := NIL;
checkMark := NIL;
title := NIL;
screen := BACKScreen;
bitMap := NIL;
minWidth := 50; maxWidth := 320;
minHeight := 20; maxHeight := 256;
type := customScreen
END;
InitPlaene
END StundenPlan.